﻿Imports System.IO

Class CBitacoraAPICContingencia
    Private APIServicio As New CAPICContingenciaServicio()
    Private lstBitacora As New List(Of CBitacoraDecalog)
    Private lstPendientes As New List(Of CBitacoraDecalog)
    Private seleccionado As New CBitacoraDecalog()

#Region "Carga Página"
    Private Sub CBitacoraAPICContingencia_Loaded(ByVal sender As Object, ByVal e As RoutedEventArgs) Handles Me.Loaded
        Try
            InicializarFechaHora()

            RealizaBusqueda()

            Mouse.OverrideCursor = Cursors.Arrow
        Catch ex As Exception
            Mouse.OverrideCursor = Cursors.Arrow

            MessageBox.Show("Error TI500. " & ex.Message, "Carga página Bitácora API Asset Allocation", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub
#End Region

#Region "Búsqueda"
    Private Sub InicializarFechaHora()
        Me.fechaInicio.Text = Date.Now.ToString("dd/MM/yyyy")
        Me.tiempoInicio.txtHora.Text = "00"
        Me.tiempoInicio.txtMinuto.Text = "00"
        Me.tiempoInicio.txtSegundo.Text = "00"

        Me.fechaFin.Text = Now.ToString("dd/MM/yyyy")
        Me.tiempoFin.txtHora.Text = Date.Now.Hour.ToString("0#")
        Me.tiempoFin.txtMinuto.Text = Date.Now.Minute.ToString("0#")
        Me.tiempoFin.txtSegundo.Text = "00"
    End Sub

    Private Sub RealizaBusqueda()
        Try
            Mouse.OverrideCursor = Cursors.Wait

            Dim intBitacora As Integer = CUtileria.GrabarBitacora("BitacoraAPIAssetAllocation", "RealizaBúsqueda", "Realiza la búsqueda por rango de fecha de los folios Decalog")

            grdDatosBitacora.ItemsSource = Nothing
            grdDatosBitacora.Items.Refresh()

            lstBitacora = APIServicio.ObtieneBitacoraDECALOG(Me.fechaInicio.Text + " " + Me.tiempoInicio.HoraCompleta, Me.fechaFin.Text + " " + Me.tiempoFin.HoraCompleta)

            grdDatosBitacora.ItemsSource = lstBitacora
            grdDatosBitacora.UpdateLayout()

            If lstBitacora.Count > 0 Then
                Dim qPendientes = From datoPend In lstBitacora Where datoPend.IdEstatus = 0 Select datoPend
                Dim qProcesados = From datoProc In lstBitacora Where datoProc.IdEstatus = 1 Select datoProc
                Dim qError = From datoError In lstBitacora Where datoError.IdEstatus = 2 Select datoError

                lblPendiente.Content = qPendientes.Count
                lblProcesados.Content = qProcesados.Count
                lblErroneos.Content = qError.Count

                If qPendientes.Count > 0 Then
                    btnActRespDec.IsEnabled = True

                    lstPendientes.Clear()

                    For Each q In qPendientes
                        Dim cbdNuevo As New CBitacoraDecalog()
                        cbdNuevo.Id = q.Id
                        cbdNuevo.IdEstatus = q.IdEstatus
                        cbdNuevo.Estatus = q.Estatus
                        cbdNuevo.Archivo = q.Archivo
                        cbdNuevo.Folio = q.Folio
                        cbdNuevo.Usuario = q.Usuario
                        cbdNuevo.Fecha = q.Fecha

                        lstPendientes.Add(cbdNuevo)
                    Next
                Else
                    btnActRespDec.IsEnabled = False
                End If
            Else
                lblPendiente.Content = "0"
                lblProcesados.Content = "0"
                lblErroneos.Content = "0"

                btnActRespDec.IsEnabled = False
            End If

            CUtileria.CompletarRegBitacora(intBitacora)

            Mouse.OverrideCursor = Cursors.Arrow
        Catch ex As Exception
            Dim intErrorBitacora As Integer = CUtileria.GrabarBitacora("BitacoraAPIAssetAllocation", "RealizaBúsqueda", ex.Message)
            CUtileria.CompletarRegBitacora(intErrorBitacora)

            Mouse.OverrideCursor = Cursors.Arrow

            MessageBox.Show("Error TI500. " & ex.Message, "Búsqueda folios", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub

    Private Sub btnConsultar_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnConsultar.Click
        RealizaBusqueda()
    End Sub

    Private Sub btnimpiar_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnLimpiar.Click
        InicializarFechaHora()

        grdDatosBitacora.ItemsSource = Nothing
        grdDatosBitacora.Items.Refresh()
        grdDatosBitacora.UpdateLayout()

        lblPendiente.Content = "0"
        lblProcesados.Content = "0"
        lblErroneos.Content = "0"

        btnActRespDec.IsEnabled = False

    End Sub
#End Region

#Region "Actualiza"
    Private Sub btnActRespDec_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnActRespDec.Click
        Try
            Mouse.OverrideCursor = Cursors.Wait

            Dim intBitacoraAct As Integer = CUtileria.GrabarBitacora("BitacoraAPIAssetAllocation", "ActualizaFolios", "Actualiza el estatus y el folio de Decalog")

            For Each cbdAux As CBitacoraDecalog In lstPendientes
                Dim intVerificacion As Integer = VerificaArchivoDECALOG(cbdAux.Archivo)

                If intVerificacion > 0 Then
                    APIServicio.ActualizaBitacoraDECALOG(cbdAux.Id, intVerificacion, CServiciosMacrosSyBaseDB.IDUSUARIO)
                End If

                If intVerificacion = 1 Then
                    ActualizaFolioDECALOG(cbdAux.Archivo, cbdAux.Id)
                ElseIf intVerificacion = 2 Then
                    ActualizaErrorDECALOG(cbdAux.Archivo, cbdAux.Id)
                ElseIf intVerificacion = 3 Then
                    ActualizaFolioDECALOG(cbdAux.Archivo, cbdAux.Id)
                    ActualizaErrorDECALOG(cbdAux.Archivo, cbdAux.Id)
                End If
            Next

            RealizaBusqueda()

            CUtileria.CompletarRegBitacora(intBitacoraAct)

            Mouse.OverrideCursor = Cursors.Arrow

            MessageBox.Show("Se realizó la búsqueda y actualización de información correctamente", "Actualiza información", MessageBoxButton.OK, MessageBoxImage.Information)
        Catch ex As Exception
            Dim intErrorAct As Integer = CUtileria.GrabarBitacora("BitacoraAPIAssetAllocation", "ActualizaFolios", ex.Message)
            CUtileria.CompletarRegBitacora(intErrorAct)

            Mouse.OverrideCursor = Cursors.Arrow

            MessageBox.Show("Error TI500. " & ex.Message, "Actualización de información", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub

    Private Function VerificaArchivoDECALOG(ByVal strArchivo As String) As Integer
        Try
            Dim strArchivoTextoError As String = strArchivo + ".err_text"
            Dim strArchivoOK As String = strArchivo + ".ok"
            Dim strArchivoTextoOK As String = strArchivo + ".ok_text"
            Dim strArchivoError As String = strArchivo + ".err"

            strArchivo = strArchivo + ".err_text"

            If File.Exists(strArchivoTextoError) And File.Exists(strArchivoOK) And File.Exists(strArchivoTextoOK) And File.Exists(strArchivoError) Then
                Dim infArchivoError As FileInfo = My.Computer.FileSystem.GetFileInfo(strArchivoError)
                Dim infArchivoTextError As FileInfo = My.Computer.FileSystem.GetFileInfo(strArchivoTextoError)
                Dim infArchivoOK As FileInfo = My.Computer.FileSystem.GetFileInfo(strArchivoOK)
                Dim infArchivoTextOK As FileInfo = My.Computer.FileSystem.GetFileInfo(strArchivoTextoOK)

                If infArchivoTextError.Length = 0 And infArchivoError.Length = 0 And infArchivoOK.Length <> 0 And infArchivoTextOK.Length <> 0 Then
                    Return 1
                ElseIf infArchivoTextError.Length > 0 And infArchivoError.Length > 0 And infArchivoTextOK.Length = 0 And infArchivoOK.Length = 0 Then
                    Return 2
                ElseIf infArchivoTextError.Length > 0 And infArchivoError.Length = 0 And infArchivoTextOK.Length = 0 And infArchivoOK.Length = 0 Then
                    Return 2
                ElseIf infArchivoTextError.Length > 0 And infArchivoError.Length > 0 And infArchivoTextOK.Length > 0 And infArchivoOK.Length > 0 Then
                    Return 3
                Else
                    Return 0
                End If
            End If

            Return 0
        Catch ex As Exception
            Return 0
        End Try
    End Function

    Private Sub ActualizaFolioDECALOG(ByVal strArchivo As String, ByVal intId As Integer)
        Try
            Dim strNombreArchivoFolio As String = strArchivo + ".ok_text", strFolio As String = String.Empty, strAux As String
            Dim inicioIdx As Integer

            If File.Exists(strNombreArchivoFolio) Then
                Dim infArchivoTextoOK As FileInfo = My.Computer.FileSystem.GetFileInfo(strNombreArchivoFolio)

                If infArchivoTextoOK.Length > 0 Then
                    Dim srArchivoOk As New StreamReader(strNombreArchivoFolio)

                    While Not srArchivoOk.EndOfStream
                        strAux = srArchivoOk.ReadLine()
                        inicioIdx = strAux.IndexOf("N# =")

                        If inicioIdx > 0 Then
                            strFolio = strFolio + (strAux.Substring(inicioIdx + 4, strAux.Length - inicioIdx - 4).Trim()).Replace("Ok,", "").Replace("[", "").Replace("]", "").Replace("(", "").Replace(")", "") + ","
                        End If

                        
                    End While

                    srArchivoOk.Close()

                    If strFolio.Length > 0 Then
                        strFolio = strFolio.Substring(0, strFolio.Length - 1)
                    End If

                    APIServicio.ActualizaFolioDECALOG(intId, strFolio, CServiciosMacrosSyBaseDB.IDUSUARIO)
                Else
                    APIServicio.ActualizaFolioDECALOG(intId, "Archivo sin información", CServiciosMacrosSyBaseDB.IDUSUARIO)
                End If
            End If
        Catch ex As Exception
            Dim intErrorFolioDECALOG As Integer = CUtileria.GrabarBitacora("BitacoraAPIAssetAllocation", "ActualizarFolioDecalog", "Ocurrió un error al obtener el folio de Decalog para el archivo " & strArchivo & ".Error: " & ex.Message)
            CUtileria.CompletarRegBitacora(intErrorFolioDECALOG)

            Mouse.OverrideCursor = Cursors.Arrow

            MessageBox.Show("Error TI500. " & ex.Message, "Actualizar Folio Decalog", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub

    Private Sub ActualizaErrorDECALOG(ByVal strArchivo As String, ByVal intId As Integer)
        Try
            Dim strNombreArchivoFolio As String = strArchivo + ".err_text", strMensaje As String = String.Empty

            If File.Exists(strNombreArchivoFolio) Then
                Dim infArchivoTextoOK As FileInfo = My.Computer.FileSystem.GetFileInfo(strNombreArchivoFolio)

                If infArchivoTextoOK.Length > 0 Then
                    strMensaje = File.ReadAllText(strNombreArchivoFolio)

                    APIServicio.ActualizaMensajeErrorDECALOG(intId, strMensaje, CServiciosMacrosSyBaseDB.IDUSUARIO)
                Else
                    APIServicio.ActualizaMensajeErrorDECALOG(intId, "Archivo sin información", CServiciosMacrosSyBaseDB.IDUSUARIO)
                End If
            End If
        Catch ex As Exception
            Dim intErrorDECALOG As Integer = CUtileria.GrabarBitacora("BitacoraAPIAssetAllocation", "ActualizarErrorDecalog", "Ocurrió un error al obtener el mensaje de Decalog para el archivo " & strArchivo & ".Error: " & ex.Message)
            CUtileria.CompletarRegBitacora(intErrorDECALOG)

            Mouse.OverrideCursor = Cursors.Arrow

            MessageBox.Show("Error TI500. " & ex.Message, "Actualizar Error Decalog", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub
#End Region

#Region "Detalle error DECALOG"
    Private Sub grdDatosBitacora_MouseRightButtonUp(ByVal sender As System.Object, ByVal e As System.Windows.Input.MouseButtonEventArgs) Handles grdDatosBitacora.MouseRightButtonUp
        Try
            Dim objDepend As DependencyObject = e.OriginalSource
            Dim renglon As DataGridRow = Nothing

            Me.grdDatosBitacora.ContextMenu = Nothing

            While Not objDepend Is Nothing
                If objDepend.GetType().Name = "DataGridRow" Then
                    renglon = objDepend

                    Me.grdDatosBitacora.UnselectAllCells()
                    renglon.IsSelected = True

                    If Not grdDatosBitacora.SelectedItem Is Nothing Then
                        seleccionado = grdDatosBitacora.SelectedItem

                        If seleccionado.IdEstatus > 1 Then
                            Me.grdDatosBitacora.ContextMenu = AgregarMenuContextual(0)
                        End If
                    End If

                    renglon.Focus()

                    Exit While
                End If
                objDepend = VisualTreeHelper.GetParent(objDepend)
            End While
        Catch ex As Exception
            MessageBox.Show("Error TI500. Ocurrió un error al seleccionar el registro: " & ex.Message, "Selección registro", MessageBoxButton.OK, MessageBoxImage.Error)
        End Try
    End Sub

    Private Function AgregarMenuContextual(ByVal opcion As Integer) As ContextMenu
        Dim miMenuContextual As New ContextMenu
        Dim mnuCopia As New System.Windows.Controls.MenuItem
        Dim mnuPegar As New System.Windows.Controls.MenuItem
        Dim mnuInsertar As New System.Windows.Controls.MenuItem

        mnuCopia.Header = "Ver detalle de orden con error"
        miMenuContextual.Items.Add(mnuCopia)
        AddHandler mnuCopia.Click, AddressOf mnuVerDetalle_click

        Return miMenuContextual
    End Function

    Private Sub mnuVerDetalle_click(ByVal sender As Object, ByVal e As RoutedEventArgs)
        If Not seleccionado Is Nothing Then
            Dim strDetalle As String

            If seleccionado.DetalleError.Length > 0 Then
                strDetalle = seleccionado.DetalleError
            Else
                strDetalle = ActualizaDetalleErrorDECALOG(seleccionado.Archivo, seleccionado.Id)
            End If

            Dim msgEspecial As New DetalleErrorOrden()

            msgEspecial.Mostrar(strDetalle)
        End If
    End Sub

    Private Function ActualizaDetalleErrorDECALOG(ByVal strArchivo As String, ByVal intId As Integer) As String
        Try
            Dim strNombreArchivoFolio As String = strArchivo + ".err", strMensaje As String = String.Empty

            If File.Exists(strNombreArchivoFolio) Then
                Dim infArchivoTextoOK As FileInfo = My.Computer.FileSystem.GetFileInfo(strNombreArchivoFolio)

                If infArchivoTextoOK.Length > 0 Then
                    strMensaje = File.ReadAllText(strNombreArchivoFolio)

                    APIServicio.ActualizaDetalleErrorDECALOG(intId, strMensaje, CServiciosMacrosSyBaseDB.IDUSUARIO)

                    Return strMensaje
                Else
                    APIServicio.ActualizaDetalleErrorDECALOG(intId, "Archivo sin información", CServiciosMacrosSyBaseDB.IDUSUARIO)

                    Return "Archivo sin información"
                End If
            Else
                APIServicio.ActualizaDetalleErrorDECALOG(intId, "No existe archivo con el detalle de la orden errónea", CServiciosMacrosSyBaseDB.IDUSUARIO)

                Return "No existe archivo con el detalle de la orden errónea"
            End If
        Catch ex As Exception
            Dim intErrorDECALOG As Integer = CUtileria.GrabarBitacora("BitacoraAPIAssetAllocation", "ActualizarDetalleErrorDecalog", "Ocurrió un error al obtener el mensaje de Decalog para el archivo " & strArchivo & ".Error: " & ex.Message)
            CUtileria.CompletarRegBitacora(intErrorDECALOG)

            Mouse.OverrideCursor = Cursors.Arrow

            MessageBox.Show("Error TI500. " & ex.Message, "Actualizar Error Decalog", MessageBoxButton.OK, MessageBoxImage.Error)

            Return ""
        End Try
    End Function
#End Region

End Class
